package com.itheima.d2_recursion;

import java.io.File;

/**
 * 目标：掌握文件搜索的实现。
 *  递归，listFile只是搜索到了一级文件对象。
 *
 *  分析：
 * 先找出D:盘下的所有一级文件对象
 * 遍历全部一级文件对象，判断是否是文件
 * 如果是文件，判断是否是自己想要的
 * 如果是文件夹，需要继续进入到该文件夹，重复上述过程
 */
public class RecursionTest3 {
    public static void main(String[] args) throws Exception {
          searchFile(new File("D:/") , "QQ.exe");
    }

    /**
     * 去目录下搜索某个文件
     * @param dir  目录(文件夹对象)
     * @param fileName 要搜索的文件名称
     */
    public static void searchFile(File dir, String fileName) throws Exception {
        // 1、把三种非法的情况都拦截住
        //public File(String pathname)              根据文件路径创建文件对象
        //2、public boolean exists()：判断当前文件对象，对应的文件路径是否存在，
        //3、public boolean isFile() : 判断当前文件对象指代的是否是文件
        //4、public boolean isDirectory()  : 判断当前文件对象指代的是否是文件夹
        if(dir == null || !dir.exists() || dir.isFile()){
            return; // 代表无法搜索
        }

        // 2、dir不是null,存在，一定是目录对象。
        // 获取当前目录下的全部一级文件对象。
        File[] files = dir.listFiles();

        // 3、判断当前目录下是否存在一级文件对象，以及是否可以拿到一级文件对象。
        //理由：有可能传过来的dir目录下面是没有一级文件对象，也有可能是空的，还有可能是没有权限拿当前目录下的一级文件对象
        if(files != null && files.length > 0){
            // 4、遍历全部一级文件对象。
            for (File f : files) {
                // 5、判断文件是否是文件,还是文件夹
                if(f.isFile()){
                    // 是文件，判断这个文件名是否是我们要找的
                    if(f.getName().contains(fileName)){
                        System.out.println("找到了：" + f.getAbsolutePath());
                        //找到了QQ之后，可以启动，想要先获取一个运行时对象，然后调用exec方法执行启动命令，把要执行的文件的绝对路径丢进去
                        Runtime runtime = Runtime.getRuntime();
                        runtime.exec(f.getAbsolutePath());
                        return;
                    }
                }else {
                    //此处文件搜索用到了（递归）
                    // 是文件夹，继续重复这个过程
                    searchFile(f, fileName);
                }
            }

        }
    }

    //自己试一试仿照写一下，但是不用这个方法
    public static void exercise(File dir,String name) throws Exception{
        if (dir==null || dir.isFile() || !dir.exists()){
            return;
        }
        File[] files = dir.listFiles();

        if (files != null && files.length>0) {
            for (File file : files) {
                if (file.isFile()) {
                    if (file.getName().contains(name)) {
                        System.out.println("找到了： "+file.getAbsolutePath());
                        Runtime runtime = Runtime.getRuntime();
                        runtime.exec(file.getAbsolutePath());
                    }
                } else {
                    exercise(file, name);
                }

            }
        }
    }


}









